package cn.kgc.spring.proxy.stic;

import cn.kgc.spring.entity.User;
import cn.kgc.spring.service.UserService;
import cn.kgc.spring.service.UserServiceImpl;

/**
 * @author: mosin
 * @version: v1.0  2022/10/13
 * 如何实现在不修改源码的基础上实现代码功能的增强   代理模式
 *
 * 代理模式:
 * 原则:
 *   1.代理对象要和目标对象(被代理对象)实现相同的接口
 *   2.代理对象要依赖于目标对象  ->代理对象中注入目标对象
 *  分类：
 *   1.静态代理  基于接口的代理
 *     1. 创建静态代理类实现和被代理类相同的接口   只做功能增强 不做核心无误功能
 *     2. 编写增强功能
 *
 *     不足：
 *        1.需要为每一个被代理类生成代理类
 *        2.增加了代码维护的难度

 *   2.动态代理
 *      在程序运行的过程中，通过jdk提供的代理技术为被代理类生成代理类
 *      2.1  jdk动态代理     基于接口的动态代理
 *
 *      2.2  cglib的动态代理  基于父子关系的代理  (继承)
 *
 */
public class UserServiceImplProxy implements UserService {

    // 注入被代理的对象
    private  UserService userService = new UserServiceImpl();

    @Override
    public Integer add(User user) {

        try {
            System.out.println("-------开启事务-------");
            //  核心业务
            userService.add(user);
            System.out.println("-------提交事务-------");
        } catch (Exception e) {
            System.out.println("-------回滚事务-------");
            e.printStackTrace();
        }

        return null;
    }

    @Override
    public Integer update(User user) {
        try {
            System.out.println("-------开启事务-------");
            //  核心业务
            userService.update(user);
            System.out.println("-------提交事务-------");
        } catch (Exception e) {
            System.out.println("-------回滚事务-------");
            e.printStackTrace();
        }
        return null;
    }

    @Override
    public Integer delete(Integer id) {
        try {
            System.out.println("-------开启事务-------");
            //  核心业务
            userService.delete(id);
            System.out.println("-------提交事务-------");
        } catch (Exception e) {
            System.out.println("-------回滚事务-------");
            e.printStackTrace();
        }
        return null;
    }
}
